package com.easybuilder.core.authorization.service.impl;

import com.easybuilder.common.utils.StringUtil;
import com.easybuilder.core.authorization.dao.SysGiteeUserDao;
import com.easybuilder.core.authorization.dto.GiteeAccessToken;
import com.easybuilder.core.authorization.dto.GiteeUser;
import com.easybuilder.core.authorization.entity.SysGiteeUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;

@Slf4j
@Service
public class GiteeServiceImpl implements GiteeService{


    @Value("${gitee.client_id}")
    private String giteeClientId;
    @Value("${gitee.client_secret}")
    private String giteeClientSecret;
    @Value("${gitee.redirect_uri}")
    private String giteeRedirectUri;
    @Value("${gitee.access_token_uri}")
    private String accessTokenUri;
    @Value("${gitee.login_uri}")
    private String giteeLoginUri;

    @Resource
    private RestTemplate restTemplate;
    @Resource
    private SysGiteeUserDao giteeUserDao;

    /** 登陆码云获取用户资料 */
    @Override
    public SysGiteeUser login(String code) {
        // 根据授权码码获取token
        String token = getTokenByAuthCode(code);
        log.info("码云获取token，授权码：{}，返回值：{}", code, token);
        if (StringUtil.isNotEmpty(token)) {
            // 根据token获取码云用户信息
            SysGiteeUser sysGiteeUser = getUserInfoByToken(token);
            return sysGiteeUser;
        }
        return null;
    }

    /** 保存码云用户最新信息 */
    private SysGiteeUser saveGiteeUser(GiteeUser giteeUser) {
        if (giteeUser != null) {
            // 检查当前码云用户是否已经保存
            SysGiteeUser sysGiteeUser = giteeUserDao.getByUserId(giteeUser.getId());
            SysGiteeUser user = giteeUserToSysGiteeUser(giteeUser);
            if (sysGiteeUser == null) {
                log.info("码云用户不存在，保存用户信息");
                // 如果未保存，则保存用户信息
                user.setCreateTime(new Date());
                giteeUserDao.insertSelective(user);
            } else {
                log.info("码云用户已存在，更新用户信息");
                // 如果已经保存，则更新最新信息
                user.setId(sysGiteeUser.getId());
                giteeUserDao.updateByPrimaryKeySelective(user);
            }
            return sysGiteeUser;
        }
        return null;
    }


    private SysGiteeUser giteeUserToSysGiteeUser(GiteeUser giteeUser) {
        SysGiteeUser sysGiteeUser = new SysGiteeUser();
        sysGiteeUser.setUserId(giteeUser.getId());
        sysGiteeUser.setUsername(giteeUser.getLogin());
        sysGiteeUser.setNickname(giteeUser.getName());
        sysGiteeUser.setUserImg(giteeUser.getAvatar_url());
        sysGiteeUser.setUrl(giteeUser.getUrl());
        sysGiteeUser.setHtmlUrl(giteeUser.getHtml_url());
        sysGiteeUser.setType(giteeUser.getType());
        sysGiteeUser.setFollowersUrl(giteeUser.getFollowers_url());
        sysGiteeUser.setFollowingUrl(giteeUser.getFollowing_url());
        sysGiteeUser.setEventsUrl(giteeUser.getEvents_url());
        sysGiteeUser.setGistsUrl(giteeUser.getGists_url());
        sysGiteeUser.setUpdateTime(new Date());
        return sysGiteeUser;
    }


    /** 根据授权码获取token */
    private String getTokenByAuthCode(String code) {
        Map params = new LinkedHashMap<>();
        params.put("grant_type", "authorization_code");
        params.put("client_id", giteeClientId);
        params.put("client_secret", giteeClientSecret);
        params.put("redirect_uri", giteeRedirectUri);
        params.put("code", code);
        ResponseEntity<GiteeAccessToken> entity = restTemplate.postForEntity(accessTokenUri, params, GiteeAccessToken.class);
        HttpStatus statusCode = entity.getStatusCode();
        if (HttpStatus.UNAUTHORIZED.equals(statusCode)) {
            log.info("根据码云授权码获取token失败，原因：授权码已失效");
            return null;
        }
        GiteeAccessToken giteeAccessToken = entity.getBody();
        return giteeAccessToken.getAccess_token();
    }

    /** 根据token获取码云用户信息 */
    private SysGiteeUser getUserInfoByToken(String token) {
        String url = giteeLoginUri + "?access_token="+token;
        GiteeUser giteeUser = restTemplate.getForObject(url, GiteeUser.class);
        log.info("码云根据token获取用户资料：token：{}，返回值：{}", token, giteeUser);
        // 保存码云用户最新信息
        SysGiteeUser sysGiteeUser = saveGiteeUser(giteeUser);
        return sysGiteeUser;
    }
}
